package main

import "fmt"

// 切片内存布局 第一个元素指针，元素个数len  容量cap

func main() {
	var intArr [5]int = [...]int{1, 2, 3, 4, 5}
	slice := intArr[1:3]
	fmt.Println("intArr=", intArr)
	fmt.Println("slice元素", slice)
	fmt.Println("slice元素个数", len(slice)) // 2
	fmt.Println("slice容量", cap(slice))   // 4

	fmt.Printf("intArr[1]地址 %v \n", &intArr[1]) //0x1301416c
	fmt.Printf("slice地址 %v \n", &slice[0])      //0x1301416c
	// 引用传递
	slice[1] = 32
	fmt.Println("intArr=", intArr) // 数据变化
	fmt.Println("slice元素", slice)  // 数据变化

	// 使用内置函数 make 创建
	// var slice2[]fl
	var slice2 []float64 = make([]float64, 5, 10)
	fmt.Println(slice2)
	fmt.Println(len(slice2)) // 5
	fmt.Println(cap(slice2)) // 10

	//
	var slice3 []string = []string{"a", "b"}
	fmt.Println(slice3)
	fmt.Println(len(slice3)) // 2
	fmt.Println(cap(slice3)) // 2

	// 遍历
	for i := 0; i < len(slice3); i++ {
		fmt.Println(slice3[i])
	}

	for i, v := range slice3 {
		fmt.Println(i, v)
	}

	var slice4 = slice3[1:2]
	fmt.Println(slice4) // b

	// append动态追加
	slice5 := append(slice4, "c", "d")
	fmt.Println(slice5) // b c d
	slice6 := append(slice5, slice3...)
	fmt.Println(slice6) // b c d a b

	var slice7 = make([]int, 5, 10)
	copy(slice7, slice)
	fmt.Println(slice7) // 2,32,0,0,0

	// string 底层是byte 不可变
	str := "helle@world"
	slice8 := str[:]
	fmt.Println(slice8)

	// string 修改
	str7 := "a,b,c"
	arr1 := []byte(str7)
	arr1[0] = 'z'
	str7 = string(arr1)
	fmt.Println(str7)
	// 处理汉字
	arr2 := []rune(str7)
	arr2[0] = '郑'
	str8 := string(arr2)
	fmt.Println(str8)

	// 斐波那契数列
	fbn := fbn(10)
	fmt.Println(fbn)
}

func fbn(n int) []uint64 {

	fbnSlice := make([]uint64, n)
	fbnSlice[0] = 1
	fbnSlice[1] = 1
	for i := 2; i < n; i++ {
		fbnSlice[i] = fbnSlice[i-1] + fbnSlice[i-2]
	}
	return fbnSlice
}
